package net.xdclass.util;

import org.springframework.beans.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;


/**
 * SpringBeanUtil类提供了一种利用Spring框架的BeanUtils进行对象间属性复制的工具.
 * 它包含两个静态方法，分别用于单个对象和列表对象的属性复制.
 * @author 小二
 */
public class SpringBeanUtil {

    /**
     * 复制一个对象的属性到另一个对象.
     *
     * @param source  源对象，其属性将被复制
     * @param target  目标对象的类，将接收源对象的属性
     * @param <T>     目标对象的泛型类型
     * @return        返回一个新的目标对象实例，其属性由源对象复制而来
     */
    public static <T> T copyProperties(Object source, Class<T> target) {
        try {
            // 创建目标对象实例
            T t = target.getConstructor().newInstance();
            // 复制源对象的属性到目标对象
            BeanUtils.copyProperties(source, t);
            return t;
        } catch (Exception e) {
            // 异常情况下，转换为运行时异常抛出
            throw new RuntimeException(e);
        }
    }

    /**
     * 批量复制列表中每个对象的属性到目标对象类的新实例.
     *
     * @param sourceList  源对象列表，其属性将被复制
     * @param target      目标对象的类，将为列表中的每个源对象创建一个新实例
     * @param <T>         目标对象的泛型类型
     * @return            返回一个目标对象列表，每个目标对象的属性由源对象列表中对应位置的对象复制而来
     */
    public static <T> List<T> copyProperties(List<?> sourceList, Class<T> target) {
        ArrayList<T> targetList = new ArrayList<>();
        // 遍历源对象列表，对每个源对象进行属性复制，并添加到目标列表
        sourceList.forEach(item -> targetList.add(copyProperties(item, target)));
        return targetList;
    }

    public static void copyProperties(Object source, Object target){
        BeanUtils.copyProperties(source,target);
    }
}

